/*
计算机所能完成的一个基本功能就是完成数据的计算，譬如加法、减法等等。但是在任何一种计算机上，计算中能够使用的数字都是有一定范围的，超过了范围，就没法得到精确的结果。

你现在接受了一个任务，要编写一个高精度计算器的核心部分。所谓高精度计算器，就是可以计算很大很大的数据的计算器。而你所需要编写的程序，就是真正完成高精度加法和高精度减法运算的两个函数，因为程序其它的部分已经由别人编写好了。

函数的输入、输出接口也已经定义完成，譬如 plus() 函数，它有三个参数 a、b 和 c，都是 char * 类型。a 和 b 分别是参加运算的两个整数，而 c 用来存放运算的结果。所有的数字都是以字符串的形式保存的。

注意，只需提交你自己编写的两个函数。

输入
输入的每一行是两个十进制的正整数和一个运算符，每个整数可以由最多 500 个数字组成。运算符可以是加号或者减号。

输出
对应着输入的每一行数据，输出计算的结果，每个结果占一行。
*/

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */


#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32) && !defined(__cplusplus)
#define inline __inline
#endif



#include <stdio.h>
#include <string.h>


#define BOOL	int 
#define TRUE	1
#define FALSE	0

static inline char * ReverseStr(char *str, int len)
{
	if (len <= 1)
	{
		return str;
	}
	else
	{
		char t = *str;
		*str = *(str + len - 1);
		*(str + len - 1) = t;
		return (ReverseStr(str + 1, len - 2) - 1);
	}
}

static inline char * ReverseString(char *source)
{
	return ReverseStr(source, strlen(source));
}

static int CompareStringNumber(char *a, char *b)
{
	int lengthA = strlen(a);
	int lengthB = strlen(b);

	if (lengthA > lengthB)
	{
		return 1;
	}
	else if (lengthA < lengthB)
	{
		return -1;
	}
	else
	{
		int result = strcmp(a, b);
		result = result > 0 ? 1 : result;
		result = result < 0 ? -1 : result;
		return result;
	}
}

void plus(char *a, char *b, char *c)
{
	a = ReverseString(a);
	b = ReverseString(b);

	int flag = 0; // 0：加数位数相同，1：a较长；-1：b较长
	int lengthA = strlen(a);
	int lengthB = strlen(b);
	int length = 0;

	if (lengthA < lengthB)
	{
		length = lengthA;
		flag = -1;
	}
	else if (lengthA > lengthB)
	{
		length = lengthB;
		flag = 1;
	}
	else
	{
		length = lengthA;
		flag = 0;
	}

	int i;
	int carry = 0;
	char p = 0;
	for (i = 0, carry = 0; i < length; i++)
	{
		p = (a[i] - 48) + (b[i] - 48) + carry;//上次的进位
		c[i] = p % 10 + 48;
		carry = p / 10;
	}

	switch (flag)
	{
		case 1:
		{
			for (; i < lengthA; i++)
			{
				p = a[i] - 48 + carry;
				c[i] = p % 10 + 48;//上次的进位
				carry = p / 10;
			}
			break;
		}
		case -1:
		{
			for (; i < lengthB; i++)
			{
				p = b[i] - 48 + carry;
				c[i] = p % 10 + 48;//上次的进位
				carry = p / 10;
			}
			break;
		}
		default:
			break;
	}

	if (carry > 0)
	{
		c[i++] = carry + 48;
	}

	for (; i > 1; i--)//移除末尾的0，也就是字符串反转后串首的0
	{
		if (c[i - 1] != '0')
		{
			break;
		}
	}
	c[i] = 0;
	ReverseString(c);
}

void minus(char *a, char *b, char *c)
{
	int flag = CompareStringNumber(a, b);
	int length = 0;
	char temp[1000];

	if (flag == 0)
	{
		c[0] = '0';
		c[1] = 0;
		return;
	}
	else if (flag > 0)
	{
		a = ReverseString(a);
		b = ReverseString(b);
	}
	else
	{
		strcpy(temp, a);
		a = ReverseString(b);
		b = ReverseString(temp);
	}

	int lengthA = strlen(a);
	int lengthB = strlen(b);
	length = lengthB;

	int i;
	int carry = 0;
	char p = 0;
	BOOL borrow = FALSE;

	for (i = 0, carry = 0; i < length; i++)
	{
		p = (a[i] - 48) - (b[i] - 48) - carry;
		if (p < 0)
		{
			borrow = TRUE;
			p += 10;
		}
		else
		{
			borrow = FALSE;
		}
		c[i] = p + 48;//上次的结尾
		if (borrow == TRUE)
		{
			carry = 1;
		}
		else
		{
			carry = 0;
		}
	}
	for (; i < lengthA; i++)
	{
		p = (a[i] - 48) - carry;
		if (p < 0)
		{
			borrow = TRUE;
			p += 10;
		}
		else
		{
			borrow = FALSE;
		}
		c[i] = p + 48;//上次的结尾
		if (borrow == TRUE)
		{
			carry = 1;
		}
		else
		{
			carry = 0;
		}
	}

	for (; i > 0; i--)//移除末尾的0，也就是字符串反转后串首的0
	{
		if (c[i - 1] != '0')
		{
			break;
		}
	}

	switch (flag)
	{
		case 1:
		default:
			c[i] = 0;
			break;

		case -1:
			c[i] = '-';
			c[i + 1] = 0;
			break;
	}
	ReverseString(c);
}

int main()
{
	char a[1000];
	char b[1000];
	char c[1000];
	char s[2];

	while (scanf("%s %s %s\n", a, s, b) == 3)
	{
		if (s[0] == '+')
		{
			plus(a, b, c);
		}
		else if (s[0] == '-')
		{
			minus(a, b, c);
		}
		printf("%s\n", c);
	}

	return 0;
}

/* PRESET CODE END - NEVER TOUCH CODE ABOVE */